package com.ruoyi.iot.utils;



import com.ruoyi.iot.domain.vo.EventCache;
import com.ruoyi.iot.domain.vo.PlanCache;
import lombok.extern.slf4j.Slf4j;

import java.util.*;

/**
 * @author LiangYun
 * @Description
 * @date 2019/12/13 14:38
 */
@Slf4j
public class MyPriorityQueue {
    //匿名Comparator实现
    public static Comparator<EventCache> idComparator = new Comparator<EventCache>() {
        @Override
        public int compare(EventCache c1, EventCache c2) {
            if (c1.getLastTime() == c2.getLastTime()) {
                return 0;
            } else if (c1.getLastTime() > c2.getLastTime()) {
                return 1;
            } else {
                return -1;
            }
        }
    };
    private static Queue<EventCache> queue = new PriorityQueue<EventCache>(1, idComparator);


    /**
     * @author LiangYun
     * @Description 用于往队列增加数据的通用方法
     * @date 2019/12/13 14:38
     */
    public static void addDataToQueue(PlanCache planEvent) {
        EventCache eventCache = new EventCache();
        eventCache.setEventId(planEvent.getId());
        eventCache.setLastTime(planEvent.getLastTime());
        queue.add(eventCache);
        log.info("计划插入成功;" + eventCache.getEventId());
    }

    /**
     * @author LiangYun
     * @Description 用于从队列取数据的通用方法，根据事件获取可执行的计划事件
     * @date 2019/12/13 14:38
     */
    public static List<EventCache> pollDataFromQueue(long i) {
        //创建返回容器
        List<EventCache> list = new ArrayList<EventCache>();
        while (true) {
            //获取队列信息
            EventCache eventCache = queue.poll();
            //为空时跳出循环
            if (eventCache == null) {
                break;
            }
            //System.out.println("time:" + i + " lastTime:" + eventCache.getLastTime() + " name:" + eventCache.getEventId());
            //当执行时间小于方法传入时间是跳出循环，并将信息重新插入队列
            if (eventCache.getLastTime() > i) {
                queue.add(eventCache);
                break;
            }
            //将符合条件的信息放入返回容器
            list.add(eventCache);
        }
        return list;
    }

    /**
     * @author LiangYun
     * @Description 用于从队列取数据的通用方法
     * @date 2019/12/13 14:38
     */
    public static List<EventCache> pollDataFromQueue() {
        List<EventCache> list = new ArrayList<EventCache>();
        while (true) {
            EventCache eventCache = queue.poll();
            if (eventCache == null) {
                break;
            }
            System.out.println("lastTime:" + eventCache.getLastTime() + " name:" + eventCache.getEventId());
            list.add(eventCache);
        }
        return list;
    }
}
